package org.szy.core.auth.util;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import org.szy.core.common.entity.LoginUser;
import org.szy.core.common.entity.LoginUserMini;

import java.util.ArrayList;
import java.util.List;

/**
 * Sa登录工具类
 *
 * @author 孙志阳
 * @date 2023-06-30
 * @since 1.0.0
 **/
public class SaLoginUtil {

    public static final String USER_MINI = "loginUserMini";
    public static final String USER_ROLES = "user_roles";
    public static final String USER_PERMISSIONS = "user_permissions";
    public static final String LOGIN_USER = "loginUser";


    /**
     * 获取简单的用户信息
     */
    public static LoginUserMini getLoginUserMini() {
        SaSession session = StpUtil.getSession();
        LoginUserMini mini = session.getModel(USER_MINI, LoginUserMini.class, null);
        if (mini == null) {
            LoginUser user = getLoginUser();
            if (user == null) return null;
            mini = new LoginUserMini();
            BeanUtil.copyProperties(user, mini, true);
            session.set(USER_MINI, mini);
        }
        return mini;
    }

    /**
     * 获取用户角色列表
     *
     * @return 用户角色列表
     */
    public static List<String> getRoles() {
        SaSession session = StpUtil.getSession();
        List<String> roles = session.getModel(USER_ROLES, List.class, null);
        if (roles == null) {
            LoginUser user = getLoginUser();
            if (user == null) return new ArrayList<>();
            roles = user.getRoles();
            session.set(USER_ROLES, roles);
        }
        return roles;
    }

    public static String getRolesAsStr() {
        return StrUtil.join(",", getRoles());
    }

    /**
     * 获取用户权限列表
     *
     * @return 用户权限列表
     */
    public static List getPermissions() {
        // 获取会话对象
        SaSession session = StpUtil.getSession();
        // 获取用户权限列表
        List permissions = session.getModel(USER_PERMISSIONS, List.class, null);
        // 如果用户权限列表为空
        if (permissions == null) {
            // 获取当前用户
            LoginUser user = getLoginUser();
            // 如果当前用户为空
            if (user == null) {
                // 返回空列表
                return new ArrayList();
            }
            // 获取当前用户的权限列表
            permissions = user.getPermissions();
            // 将用户权限列表保存到会话中
            session.set(USER_PERMISSIONS, permissions);
        }
        // 返回用户权限列表
        return permissions;
    }

    public static String getPermissionsAsStr() {
        return StrUtil.join(",", getPermissions());
    }

    /**
     * 获取当前登录用户
     *
     * @author wangbuhao
     * @date 2022/7/8 10:41
     **/
    public static LoginUser getLoginUser() {
        return StpUtil.getSession().getModel(LOGIN_USER, LoginUser.class);
    }


}
